// 基于axios封装请求函数
// import router from '@/router'
import ajax from 'axios'
import { setToken, getToken, removeToken } from './token'
// import { refreshTokenAPI } from '@/api/index'
import router from '@/router'

const axios = ajax.create({
  baseURL: 'https://toutiao.itheima.net', // 基地址
  timeout: 10000, // 超时时间
  cancelRequest: true
})

// 请求拦截器
axios.interceptors.request.use(function (request) {
  // 发送前请求头携带本地的token
  const token = getToken() || '' // 第一次登陆上本地是没有token的
  if (token.length > 0 && request.headers.Authorization === undefined) {
    request.headers.Authorization = `Bearer ${getToken()}`
  }
  return request
}, async function (error) {
  return Promise.reject(error)
})

// 响应拦截器
axios.interceptors.response.use(function (response) {
  // 当状态码为2xx/3xx开头的进这里
  // 对响应数据做点什么
  return response
}, async function (error) {
  // 响应状态码4xx/5xx进这里
  // 对响应错误做点什么
  if (error.response.status === 401) {
    // Toast('身份过期，请重新登录！')
    //  401--身份过期，需要重新登录.同时清空本地的存储
    // setToken('')
    //  不能回退
    // router.replace({
    //   path: '/login'
    // })
    // 使用refresh_token续签token
    // const res = await refreshTokenAPI()
    // console.log('重新请求token', res)
    // 设置新的token
    // setToken(res.data.data.token)
    // 设置新的请求头参数，重新请求错误的请求
    // error.config.headers.Authorization = `Bearer ${res.data.data.token}`
    // error.config是上依请求的配置,将再次请求的结果返回
    // return axios(error.config)

    // ===================保存未遂地址后跳转至登录页面=========================
    removeToken()
    // 以query参数的形式
    router.push({
      path: `/login?path=${router.currentRoute.fullPath}`
    })
  } else if (error.response.status === 500 && error.config.url === '/v1_0/authorizations' && error.config.method === 'put') {
    // refresh_token也过期了！返回登陆页面
    setToken('')
    router.replace({
      path: '/login'
    })
  }
  return Promise.reject(error)
})

export default ({ url, method = 'GET', params = {}, data = {}, headers = {} }) => {
  return axios({
    url,
    method,
    params, // 即将与请求一起发送的 URL 参数
    data, // 发送给服务端的数据
    headers
  })
}
